home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / miscutl1.arc / CBTA.AQM / $CBTA.ASM
Assembly Source File  |  1984-04-08  |  5KB  |  216 lines

  1.     NAME    $CBTA
  2.     PAGE    60,132
  3.     TITLE    $CBTA - CONVERT BINARY TO ASCII
  4.     COMMENT *
  5.  
  6. AUTHOR:     LEGARE COLEMAN
  7.  
  8. DATE:        1/1/84
  9.  
  10. VERSION:    1.00
  11.  
  12. REVISIONS:
  13.  
  14. FUNCTION:    THIS ROUTINE CONVERTS A 32 BIT SIGNED BINARY INTEGER TO
  15.         TO A ASCII STRING.
  16.  
  17. INPUT:        AX = LOW 16 BITS OF BINARY INTEGER
  18.  
  19.         BX = HIGH 16 BITS OF BINARY INTEGER
  20.  
  21.         DS:DI = A(ASCII STRING BUFFER)
  22.  
  23.         CH = LEADING ZERO FILL BYTE.  IF CH = 00H, THEN THE
  24.              ASCII STRING WILL BE LEFT JUSTIFIED IN THE BUFFER.
  25.              IF CH NOT = 00H, THEN LEADING ZEROES IN THE ASCII
  26.              STRING ARE REPLACED BY THE BYTE IN CH, AND THE ASCII
  27.              STRING BUFFER MUST BE AT LEAST ELEVEN BYTES IN LENGTH.
  28.  
  29. OUTPUT:     IF CF = 0, NO ERROR
  30.  
  31.             STRING = CONVERTED INTEGER
  32.  
  33.             DS:DI = A(BYTE AFTER ASCII STRING IN BUFFER)
  34.  
  35.             CX = LENGTH OF UNUSED BUFFER
  36.  
  37.         IF CF NOT = 0, ERROR - BUFFER TOO SHORT
  38.  
  39.             STRING = HIGH DIGITS OF RESULT
  40.  
  41. *
  42.     PAGE
  43. DSEG    SEGMENT PARA PUBLIC 'DATA'
  44. TABLE    DD    2000000000    ; CONVERSION TABLE
  45.     DD    1000000000
  46.     DD    900000000
  47.     DD    800000000
  48.     DD    700000000
  49.     DD    600000000
  50.     DD    500000000
  51.     DD    400000000
  52.     DD    300000000
  53.     DD    200000000
  54.     DD    100000000
  55.     DD    90000000
  56.     DD    80000000
  57.     DD    70000000
  58.     DD    60000000
  59.     DD    50000000
  60.     DD    40000000
  61.     DD    30000000
  62.     DD    20000000
  63.     DD    10000000
  64.     DD    9000000
  65.     DD    8000000
  66.     DD    7000000
  67.     DD    6000000
  68.     DD    5000000
  69.     DD    4000000
  70.     DD    3000000
  71.     DD    2000000
  72.     DD    1000000
  73.     DD    900000
  74.     DD    800000
  75.     DD    700000
  76.     DD    600000
  77.     DD    500000
  78.     DD    400000
  79.     DD    300000
  80.     DD    200000
  81.     DD    100000
  82.     DD    90000
  83.     DD    80000
  84.     DD    70000
  85.     DD    60000
  86.     DD    50000
  87.     DD    40000
  88.     DD    30000
  89.     DD    20000
  90.     DD    10000
  91.     DD    9000
  92.     DD    8000
  93.     DD    7000
  94.     DD    6000
  95.     DD    5000
  96.     DD    4000
  97.     DD    3000
  98.     DD    2000
  99.     DD    1000
  100.     DD    900
  101.     DD    800
  102.     DD    700
  103.     DD    600
  104.     DD    500
  105.     DD    400
  106.     DD    300
  107.     DD    200
  108.     DD    100
  109.     DD    90
  110.     DD    80
  111.     DD    70
  112.     DD    60
  113.     DD    50
  114.     DD    40
  115.     DD    30
  116.     DD    20
  117.     DD    10
  118.     DD    9
  119.     DD    8
  120.     DD    7
  121.     DD    6
  122.     DD    5
  123.     DD    4
  124.     DD    3
  125.     DD    2
  126.     DD    1
  127. DSEG    ENDS
  128.     PAGE
  129. CSEG    SEGMENT PARA PUBLIC 'CODE'
  130.     PUBLIC    $CBTA
  131.     EXTRN    SAVREG:NEAR
  132.     ASSUME    CS:CSEG,DS:DSEG,SS:NOTHING,ES:NOTHING
  133. $CBTA    PROC    NEAR
  134.     CALL    SAVREG        ; SAVE REGISTERS
  135.     SUB    DX,DX        ; DX = 0
  136.     MOV    DL,CH        ; DL = LEADING ZERO FILL BYTE
  137.     PUSH    DX        ; PUT FILL BYTE IN STACK WORK AREA
  138.     SUB    CH,CH        ; CH = 0
  139.     PUSH    CX        ; PUT BUFFER LENGTH IN STACK WORK AREA
  140.     MOV    CX,10        ; CX = 10
  141.     PUSH    CX        ; PUT DIGIT COUNT IN STACK WORK AREA
  142.     MOV    BP,SP        ; BP = A(STACK WORK AREA)
  143.     AND    BX,BX        ; INTEGER NEGATIVE ?
  144.     JNS    $100        ; IF NS, NO
  145.     NEG    AX        ; MAKE IT POSITIVE
  146.     NOT    BX
  147.     DEC    WORD PTR [BP+2] ; DECREMENT STRING LENGTH
  148.     JS    $900        ; IF S, BUFFER TOO SMALL
  149.     MOV    BYTE PTR [DI],'-'       ; PUT MINUS SIGN IN BUFFER
  150.     INC    DI        ; DI = A(NEXT BUFFER BYTE)
  151. $100:
  152.     MOV    CX,2        ; CX = FIRST LOOP COUNT
  153.     MOV    SI,OFFSET TABLE ; SI = A(CONVERSION TABLE)
  154. $200:
  155.     CMP    BX,[SI+2]    ; VALUE < TABLE ENTRY ?
  156.     JB    $300        ; IF B, YES
  157.     JA    $400        ; IF A, VALUE > TABLE ENTRY
  158.     CMP    AX,[SI]     ; VALUE < TABLE ENTRY ?
  159.     JB    $300        ; IF B, YES
  160.     JMP    $400        ; VALUE >= TABLE ENTRY
  161. $300:
  162.     ADD    SI,4        ; SI = A(NEXT TABLE ENTRY)
  163.     LOOP    $200        ; LOOP IF NOT DONE
  164.     JMP    $500        ; NEXT DIGIT = ZERO
  165. $400:
  166.     SUB    AX,[SI]     ; VALUE - TABLE ENTRY
  167.     SBB    BX,[SI+2]
  168. $500:
  169.     MOV    CH,CL        ; CH = INDEX
  170.     MOV    DX,[BP+4]    ; DH = FLAG, DL = FILL BYTE
  171.     AND    DH,DH        ; SIGNIFICANT DIGIT YET ?
  172.     JNZ    $800        ; IF NZ, YES
  173.     AND    CL,CL        ; IS THIS A LEADING ZERO ?
  174.     JNZ    $700        ; IF NZ, NO
  175.     AND    DL,DL        ; IS THERE A FILL BYTE ?
  176.     JZ    $600        ; IF Z, NO
  177.     DEC    WORD PTR [BP+2] ; DECREMENT LENGTH REMAINING IN BUFFER
  178.     JS    $900        ; IF S, ERROR - BUFFER TOO SMALL
  179.     MOV    [DI],DL     ; PUT FILL BYTE IN BUFFER
  180.     INC    DI        ; DI = A(NEXT BUFFER BYTE)
  181. $600:
  182.     MOV    CX,9        ; CX = NEXT LOOP COUNT
  183.     DEC    WORD PTR [BP]    ; DECREMENT DIGIT COUNT
  184.     JNZ    $200        ; IF NZ, CONTINUE CONVERSION
  185.     JMP    $1000        ; EXIT - CONVERSION COMPLETE
  186. $700:
  187.     INC    DH        ; SET SIGNIFICANT DIGIT FLAG
  188.     MOV    [BP+4],DX    ; STORE FLAG
  189. $800:
  190.     DEC    WORD PTR [BP+2] ; DECREMENT LENGTH REMAINING IN BUFFER
  191.     JS    $900        ; IF S, ERROR - BUFFER TOO SMALL
  192.     OR    CH,30H        ; CH = ASCII DIGIT
  193.     MOV    [DI],CH     ; PUT DIGIT IN BUFFER
  194.     INC    DI        ; DI = A(NEXT BYTE IN BUFFER)
  195.     SUB    CH,CH        ; CH = 0
  196.     SHL    CX,1        ; CX = INDEX * 2
  197.     SHL    CX,1        ; CX = INDEX * 4
  198.     ADD    SI,CX        ; SI = A(NEXT TABLE ENTRY)
  199.     JMP    $600        ; GO TO NEXT DIGIT
  200. $900:
  201.     ADD    SP,6        ; REMOVE WORK AREA FROM STACK
  202.     STC            ; SET ERROR FLAG
  203.     RET            ; RETURN TO CALLER
  204. $1000:
  205.     POP    CX        ; REMOVE WORK AREA FROM STACK
  206.     POP    CX        ; CX = LENGTH REMAINING IN BUFFER
  207.     POP    AX        ; REMOVE WORK AREA FROM STACK
  208.     MOV    BP,SP        ; BP = A(TOP OF STACK)
  209.     MOV    [BP+14],CX    ; PUT UNUSED BUFFER LENGTH IN RETURN REGISTER
  210.     MOV    [BP+6],DI    ; PUT A(NEXT BUFFER BYTE) IN RETURN REGISTER
  211.     CLC            ; CLEAR ERROR FLAG
  212.     RET            ; RETURN TO CALLER
  213. $CBTA    ENDP
  214. CSEG    ENDS
  215.     END
  216.